package com.hdu.metrics_center.mapper;


import com.hdu.metrics_center.enums.RedisCommandType;
import com.hdu.metrics_center.metrics.meta.MetricsMetaDO;
import com.hdu.metrics_center.metrics.meta.MetricsQueryMeta;
import com.hdu.metrics_center.metrics.meta.MetricsSaveAndDelMeta;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.List;


/**
 * 模拟数据库查询指标元信息
 */
@Service
public class MetricsMetaMapper {


    private final List<MetricsMetaDO> METRICS_META_DOS = new ArrayList<>();

    @PostConstruct
    void init() {
        // 指标 - 坐席休息次数
        METRICS_META_DOS.add(agentRestCount());
        // 指标 - 坐席休息列表
        METRICS_META_DOS.add(agentRestList());
        // 指标 - 坐席休息人数
        METRICS_META_DOS.add(agentRestPeopleCount());
        // 指标 - 坐席单次休息时长
        METRICS_META_DOS.add(agentSingleRestTime());
    }


    public MetricsMetaDO queryMetricsMetaByMetricsName(String metricsName) {
        return METRICS_META_DOS
                .stream()
                .filter(metricsMetaDO -> metricsMetaDO.getMetricsName().equals(metricsName))
                .findFirst()
                .orElse(null);
    }


    /**
     * 坐席休息次数
     *
     * @return
     */
    private MetricsMetaDO agentRestCount() {
        MetricsMetaDO metricsMetaDO = new MetricsMetaDO();
        metricsMetaDO.setId(1L);
        metricsMetaDO.setMetricsName("agentRestCount");

        MetricsSaveAndDelMeta metricsSaveAndDelMeta = new MetricsSaveAndDelMeta();
        metricsSaveAndDelMeta.setSaveCommand(RedisCommandType.HINCRBY);
        metricsSaveAndDelMeta.setKeyTemplate("im:agent:#metricsName#:#businessLineId#");
        metricsSaveAndDelMeta.setFieldTemplate("#agentNum#");
        metricsMetaDO.setMetricsSaveAndDelMeta(metricsSaveAndDelMeta);

        MetricsQueryMeta metricsQueryMeta = new MetricsQueryMeta();
        metricsQueryMeta.setQueryCommand(RedisCommandType.HGET);
        metricsQueryMeta.setKeyTemplate("im:agent:#metricsName#:#businessLineId#");
        metricsQueryMeta.setFieldTemplate("#agentNum#");
        metricsMetaDO.setMetricsQueryMeta(metricsQueryMeta);

        return metricsMetaDO;
    }


    /**
     * 坐席休息列表
     *
     * @return
     */
    private MetricsMetaDO agentRestList() {
        MetricsMetaDO metricsMetaDO = new MetricsMetaDO();
        metricsMetaDO.setId(2L);
        metricsMetaDO.setMetricsName("agentRestList");

        MetricsSaveAndDelMeta metricsSaveAndDelMeta = new MetricsSaveAndDelMeta();
        metricsSaveAndDelMeta.setSaveCommand(RedisCommandType.HSET);
        metricsSaveAndDelMeta.setKeyTemplate("im:agent:#metricsName#:#businessLineId#");
        metricsSaveAndDelMeta.setFieldTemplate("#agentNum#");
        metricsSaveAndDelMeta.setDelCommand(RedisCommandType.HDEL);
        metricsMetaDO.setMetricsSaveAndDelMeta(metricsSaveAndDelMeta);

        MetricsQueryMeta metricsQueryMeta = new MetricsQueryMeta();
        metricsQueryMeta.setQueryCommand(RedisCommandType.HGETALL);
        metricsQueryMeta.setKeyTemplate("im:agent:#metricsName#:#businessLineId#");
        metricsQueryMeta.setFieldTemplate("#agentNum#");
        metricsMetaDO.setMetricsQueryMeta(metricsQueryMeta);

        return metricsMetaDO;
    }


    /**
     * 坐席休息人数
     *
     * @return
     */
    private MetricsMetaDO agentRestPeopleCount() {
        MetricsMetaDO metricsMetaDO = new MetricsMetaDO();
        metricsMetaDO.setId(3L);
        metricsMetaDO.setMetricsName("agentRestPeopleCount");

        // 不需要 del 和 save 逻辑 该指标完全依赖于 坐席休息列表 ，也就是直接对 坐席休息列表 hlen 求长度就好
        MetricsQueryMeta metricsQueryMeta = new MetricsQueryMeta();
        metricsQueryMeta.setQueryCommand(RedisCommandType.HLEN);
        metricsQueryMeta.setKeyTemplate("im:agent:agentRestList:#businessLineId#");
        metricsMetaDO.setMetricsQueryMeta(metricsQueryMeta);

        return metricsMetaDO;
    }


    /**
     * 坐席单次休息时间
     *
     * @return
     */
    private MetricsMetaDO agentSingleRestTime() {
        MetricsMetaDO metricsMetaDO = new MetricsMetaDO();
        metricsMetaDO.setId(4L);
        metricsMetaDO.setMetricsName("agentSingleRestTime");

        MetricsSaveAndDelMeta metricsSaveAndDelMeta = new MetricsSaveAndDelMeta();
        metricsSaveAndDelMeta.setSaveCommand(RedisCommandType.HSET);
        metricsSaveAndDelMeta.setDelCommand(RedisCommandType.HDEL);
        metricsSaveAndDelMeta.setKeyTemplate("im:agent:#metricsName#:#businessLineId#");
        metricsSaveAndDelMeta.setFieldTemplate("#agentNum#");
        metricsMetaDO.setMetricsSaveAndDelMeta(metricsSaveAndDelMeta);

        MetricsQueryMeta metricsQueryMeta = new MetricsQueryMeta();
        metricsQueryMeta.setQueryCommand(RedisCommandType.HGET);
        metricsQueryMeta.setKeyTemplate("im:agent:#metricsName#:#businessLineId#");
        metricsQueryMeta.setFieldTemplate("#agentNum#");
        metricsMetaDO.setMetricsQueryMeta(metricsQueryMeta);
        return metricsMetaDO;
    }


}
